package com.smile.frame.common.util;

import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

/**
 * 请求工具类
 *
 * @date 2020/4/14 15:57
 */
@Slf4j
public class LocalHttpUtil {

    private static ServletRequestAttributes getRequestAttributes() {
        RequestAttributes attributes = RequestContextHolder.getRequestAttributes();
        return (ServletRequestAttributes) attributes;
    }

    /**
     * 获取request
     */
    public static HttpServletRequest getRequest() {
        return getRequestAttributes().getRequest();
    }

    /**
     * 获取response
     */
    public static HttpServletResponse getResponse() {
        return getRequestAttributes().getResponse();
    }

    /**
     * 获取session
     */
    public static HttpSession getSession() {
        return getRequest().getSession();
    }

    /**
     * 获取String参数
     */
    public static String getParameter(String name) {
        return getRequest().getParameter(name);
    }


    /**
     * 获取token
     *
     * @return token信息
     */
    public static String getToken() {
        String token = (String) getRequest().getAttribute("token");
        if (token == null) {
            throw new NullPointerException("request 中获取token失败");
        }
        return token;
    }


    /**
     * 将字符串渲染到客户端
     *
     * @param string 待渲染的字符串
     */
    public static void renderString(String string) {
        try {
            HttpServletResponse response = getResponse();
            response.setContentType("application/json");
            response.setCharacterEncoding("utf-8");
            response.getWriter().print(string);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 判断是否有token
     *
     * @return 结果
     */
    public boolean hasToken() {
        String token = (String) getRequest().getAttribute("token");
        return token != null && !("").equals(token.trim());
    }

    /**
     * 请求获取参数
     *
     * @param request
     * @param clazz
     * @param <T>
     * @return
     * @throws Exception
     */
    public static <T> T getRequestParam(HttpServletRequest request, Class<T> clazz) throws Exception {
        InputStream is = null;
        try {
            is = request.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(is));
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line);
            }
            T dto = JSONUtil.toBean(sb.toString(), clazz);
            return dto;
        } catch (Exception e) {
            log.error("请求获取参数失败：", e);
        } finally {
            if (is != null) {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return clazz.newInstance();
    }
}
